/**
 * \file   simbolo.cpp
 * \author Fabian Jesus Machado
 * \date   Septiembre de 2011
 * 
 *  Este archivo es parte del proyecto NPASM, un ensamblador para
 * microcontroladores PIC con sintaxis Intel, desarrollado inicialmente
 * por Fabian Machado (fabianjsm@gmail.com, twitter@fabianjsm).
 *  El codigo fuente esta diponible en el repositorio SVN de Google:
 *      http://npasm.googlecode.com/svn/trunk.
 * 
 * 
 */
#include <string.h>
#include "simbolo.h"
#include "auxiliar.h"

simbolo::simbolo(std::string _nombre, int _tipo, int _mod)
{
	nombre = _nombre;
	tipo = _tipo;
	mod = _mod;
	ucase = false;
	flags = 0;
}

simbolo::~simbolo()
{
}

std::string simbolo::GetNombre()
{
	return nombre;
}

void simbolo::SetNombre(std::string _nombre)
{
	nombre = _nombre;
}

int simbolo::GetTipo()
{
	return tipo;
}

void simbolo::SetTipo(int _tipo)
{
	tipo = _tipo;
}

int simbolo::GetLindef()
{
	return lindef;
}

void simbolo::SetLindef(int _lindef)
{
	lindef = _lindef;
}

unsigned int simbolo::GetFlags()
{
	return flags;
}

void simbolo::SetFlags(unsigned int val)
{
	flags = val;
}

void simbolo::ClrFlag(unsigned int msk)
{
	flags &= ~msk;
}

void simbolo::SetFlag(unsigned int msk)
{
	flags |= msk;
}

unsigned int simbolo::GetFlag(unsigned int msk)
{
	return flags & msk;
}

void simbolo::SetVal(int val)
{
	valor.val_int = val;
}

int simbolo::ToInt()
{
	return valor.val_int;
}

void simbolo::SetVal(unsigned int val)
{
	valor.val_uint = val;
}
unsigned int simbolo::ToUInt()
{
	return valor.val_uint;
}

bool simbolo::GetUcase()
{
	return ucase;
}

void simbolo::SetUcase(bool _ucase)
{
	ucase = _ucase;
}

bool simbolo::operator==(std::string _nombre)
{
	if(ucase)
		return !stricmp(nombre.c_str(), _nombre.c_str());
	return nombre == _nombre;
}

bool simbolo::operator<(simbolo &_sbl)
{
	return (signed int)strcmp(_sbl.GetNombre().c_str(), nombre.c_str()) > 0;
}

bool simbolo::operator>(simbolo &_sbl)
{
	return (signed int)strcmp(_sbl.GetNombre().c_str(), nombre.c_str()) < 0;
}

void simbolo::SetOp(opcode_t *_op)
{
	op=_op;
}

opcode_t *simbolo::GetOp()
{
	return op;
};
